/*
* Sun Public License Notice
*
* The contents of this file are subject to the Sun Public License
* Version 1.0 (the "License"). You may not use this file except in
* compliance with the License. A copy of the License is available at
* http://www.sun.com/
*
* The Original Code is Forte for Java, Community Edition. The Initial
* Developer of the Original Code is Sun Microsystems, Inc. Portions
* Copyright 1997-2000 Sun Microsystems, Inc. All Rights Reserved.
*/
package org.netbeans.editor;
/**
* Finders are used to find some information in document without
* creating copy of the data. They are used as arguments for
* <CODE>DocCache.find()</CODE>. During the find operation
* the <CODE>find()</CODE> method of the finder is called
* with some buffer of character data and some additional information.
* There are two possible search directions and therefore there
* are two finder types: Forward Finders (FwdFinder)
* and Backward Finders (BwdFinder)
*
* @author Miloslav Metelka
* @version 1.00
*/
public interface Finder {
/** Reset method is used to initialize finder.
* It is called once at the begining of find. To be most effective
* <CODE>reset()</CODE> is called after both <CODE>setForward()</CODE>
* and <CODE>setLimitPos()</CODE> had been called.
*/
public void reset();
/** This is the most important function in finder. It can be called several
* times if the whole search area doesn't fit in the cache buffer.
* Usual forward search should look like this: <CODE>
* int offset = reqPos - bufferStartPos;
* while (offset < offset2) {
* if (buffer[offset]-meets-condition) {
* set-found-flag
* return offset + bufferStartPos;
* }
* offset++;
* }
* return offset + bufferStartPos;</CODE>
* Bakward search follows: <CODE>
* int offset = reqPos - bufferStartPos
* while (offset >= offset1) {
* if (buffer[offset]-meets-condition) {
* set-found-flag
* return offset + bufferStartPos;
* }
* offset--;
* }
* return offset + bufferStartPos;</CODE>
* Caution! Nothing can be written to the data comming in buffer to
* <CODE>find()</CODE> method because of performance reasons
* these are primary document data, not a copy.
* Buffer is always guaranteed to have at least one char - it is
* char standing at reqPos. However there can be calls to <CODE>find()</CODE>
* when there will be only that one character, so <CODE>find()</CODE> must
* must be prepared for this.
* Unlike calling <CODE>DocCache.find()</CODE> the offset1 < offset2 even
* for backward searches.
* @param bufferStartPos begining position of the buffer (not search area).
* @param buffer buffer with chars to be searched
* @param offset1 offset of begining of searchable area in buffer.
* No searching below this offset can be performed.
* @param offset2 offset of end of searchable area in buffer.
* No searching beyond this offset can be performed.
* @param reqPos required position. Initially it is the begining
* search position requested by caller. In subsequent calls
* it is the same value as returned from previous call
* to <CODE>find()</CODE> method.
* @param limitPos is filled with position beyond which search cannot go.
* (i.e. forward: pos < limitPos and backward: pos >= limitPos)
* Some finders i.e. finder that tries to find some word with
* whole-words-only flag turned on can benefit
* from this information. If the searched word is at the very end of
* the document the finder wouldn't normally find it as it would request
* the next buffer even when the whole word was matched because the finder
* needs to find white space to know the word ended there. However this
* would be beyond the search area so EOT exception would be raised.
* To correctly manage this situation finder must care for limitPos.
* When it sees the word and knows this is the last text in document
* it signals that it found the word.
* @return in case the string was found, <CODE>find()</CODE>
* method returns the position (not offset) where the string starts
* (and must also set some flag resulting to that <CODE>isFound()</CODE>
* method will return true).
* If the string was not yet found, the function should return
* position (not offset) where the next search should continue. If this
* position is greater or equal than limit position
* (lower than limit position for backward search),
* searching will stop resulting in -1 as returned position.
* The position returned will be passed as <CODE>reqPos</CODE> in next
* call to <CODE>find()</CODE> method.
*/
public int find(int bufferStartPos, char buffer[], int offset1,
int offset2, int reqPos, int limitPos);
/** Using this function caller determines if finder found
* desired string. The returned position of <CODE>find</CODE> method
* gives the position where the string occurs.
*/
public boolean isFound();
}
/*
* Log
* 6 Gandalf 1.5 1/13/00 Miloslav Metelka
* 5 Gandalf 1.4 1/7/00 Miloslav Metelka
* 4 Gandalf 1.3 1/6/00 Miloslav Metelka
* 3 Gandalf 1.2 10/23/99 Ian Formanek NO SEMANTIC CHANGE - Sun
* Microsystems Copyright in File Comment
* 2 Gandalf 1.1 4/8/99 Miloslav Metelka
* 1 Gandalf 1.0 2/3/99 Miloslav Metelka
* $
*/